package test_streamer.client;
import us.bpsm.edn.Keyword;
import us.bpsm.edn.printer.Printer;
import us.bpsm.edn.printer.Printers;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.util.HashMap;
import java.util.Map;
/**
* @author kawasima
*/
public class BeanPrinterFn implements Printer.Fn {
@Override
public void eval(Object bean, Printer printer) {
Printer.Fn<Object> fn = (Printer.Fn<Object>)Printers.defaultPrinterProtocol().lookup(bean.getClass());
if (fn != null) {
fn.eval(bean, printer);
} else {
try {
BeanInfo info = Introspector.getBeanInfo(bean.getClass());
Map<Keyword, Object> beanMap = new HashMap<Keyword, Object>();
for (PropertyDescriptor propDesc : info.getPropertyDescriptors()) {
if (propDesc.getName().equals("class"))
continue;
try {
Object val = propDesc.getReadMethod().invoke(bean);
PropertyName propAnno = propDesc.getReadMethod().getAnnotation(PropertyName.class);
String propName = (propAnno != null) ? propAnno.value() : propDesc.getName();
beanMap.put(keywordize(propName), val);
} catch(Exception ignore) {}
}
printer.printValue(beanMap);
} catch (IntrospectionException ex) {
throw new IllegalArgumentException("Not bean.");
}
}
}
protected Keyword keywordize(String name) {
if (name == null)
return null;
if (name.length() == 1)
return Keyword.newKeyword(name);
StringBuilder sb = new StringBuilder(40);
int pos = 0;
for (int i=1; i<name.length(); i++) {
if (Character.isUpperCase(name.charAt(i))) {
if (sb.length() != 0) {
sb.append('-');
}
sb.append(name.substring(pos, i).toLowerCase());
pos = i;
}
}
if (sb.length() != 0)
sb.append('-');
sb.append(name.substring(pos, name.length()).toLowerCase());
return Keyword.newKeyword(sb.toString());
}
}